;
; Ullrich von Bassewitz, 2009-11-04
;
; CC65 runtime: 32by16 => 16 unsigned division
;

       	.export	       	udiv32by16r16, udiv32by16r16m

        .include        "zeropage.inc"


;---------------------------------------------------------------------------
; 32by16 division. Divide ptr1:ptr2 by ptr3. Result is in ptr1, remainder
; in sreg.
;
;   lhs         rhs           result      result also in    remainder
; -----------------------------------------------------------------------
;   ptr1:ptr2   ptr3          ax          ptr1              sreg
;


udiv32by16r16:
        sta     ptr3
        stx     ptr3+1
udiv32by16r16m:
        lda    	#0
 	sta	sreg+1
 	ldy	#32

L0:    	asl     ptr1
        rol     ptr1+1
        rol     ptr2
        rol     ptr2+1
        rol     a
        rol     sreg+1

 	pha
 	cmp	ptr3
 	lda	sreg+1
 	sbc	ptr3+1
 	bcc	L1

 	sta	sreg+1
 	pla
 	sbc	ptr3
 	pha
 	inc	ptr1

L1:	pla
 	dey
 	bne	L0
 	sta	sreg
        lda     ptr1
        ldx     ptr1+1
 	rts

